package manager.modulo.sistema.dao;

import java.sql.SQLException;
import manager.auxiliares.MensagemExcessao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.LinkedList;
import manager.auxiliares.Configurations;
import manager.auxiliares.Format;
import manager.principal.fonte.JanelaLogin;
import manager.interfaces.InterfaceDao;
import manager.modulo.sistema.enumerator.EnumSituacaoUsuario;
import manager.modulo.sistema.enumerator.EnumSituacaoUsuario.SituacaoUsuario;
import manager.modulo.sistema.enumerator.EnumTipoUsuario;
import manager.modulo.sistema.enumerator.EnumTipoUsuario.TipoUsuario;

/**
 * Esta classe será utilizada para cadastra a entidade usuario no banco de dados
 *
 * @author Thiago
 */
public class UsuarioDao implements InterfaceDao {

    private int id;
    private String senha;
    private String email;
    private String nome;
    private SituacaoUsuario situacao;
    private TipoUsuario tipoUsuario;

    /**
     * Inicializando as variáveis
     */
    public UsuarioDao() {
        senha = "";
        email = "";
        nome = "";
        situacao = SituacaoUsuario.NAOENCONTRADO;
        id = 0;
        tipoUsuario = TipoUsuario.NAOENCONTRADO;
        
    }

    /**
     * Buscar o id de um usuário pelo e-mail
     *
     * @param email E-mail do usuário a ser buscado
     * @return Retorno o id do usuário encontrato, caso contrário retorna 0
     * quando não o encontra
     */
    public static int getIdUsuarioPorEmail(String email) {
        try {

            String sql = "SELECT id FROM usuario WHERE tx_email = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setString(1, email);
            ResultSet resultSet = preparedStatement.executeQuery();
            int idUser = 0;
            if (resultSet.first()) {
                idUser = resultSet.getInt("id");
            }
            resultSet.close();
            preparedStatement.close();
            return idUser;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Usuários");
            return 0;
        }
    }

    public LinkedList<String> buscar(String option, String search, boolean limite) throws SQLException {
        LinkedList<String> result = new LinkedList<String>();
        if (!search.equals("")) {
            String sql = "";
            String tamanhoBusca = limite ? ("LIMIT 0," + Configurations.getAutoCompleteSizeSearch()) : "";
            if (option.equalsIgnoreCase("E-mail")) {// Buscando por Email
                sql = "SELECT tx_email FROM usuario WHERE tx_email LIKE ? ORDER BY tx_email " + tamanhoBusca;
            }
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, search + "%");
                ResultSet resultSet = preparedStatement.executeQuery();
                while (resultSet.next()) {
                    result.add(resultSet.getString(1));
                }
            }
        }
        return result;
    }

    public static LinkedList buscaTabela(String option, String search) throws SQLException {
        LinkedList result = new LinkedList();
        if (!search.equals("")) {
            String sql = "";
            if (option.equalsIgnoreCase("E-mail")) {//Buscando por email
                sql = "SELECT * FROM usuario WHERE tx_email LIKE ? ORDER BY tx_email ";
            } else if (option.equalsIgnoreCase("Situação")) {
                sql = "SELECT * FROM usuario WHERE cd_situacao = ? ORDER BY tx_email";
                search = Integer.toString(UsuarioDao.getSituacao(search));
            }
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, search + "%");
                ResultSet resultSet = preparedStatement.executeQuery();

                LinkedList<String> columnEmail = new LinkedList<String>();
                LinkedList<String> columnSituation = new LinkedList<String>();
                LinkedList<Integer> columnId = new LinkedList<Integer>();

                while (resultSet.next()) {
                    columnId.add(resultSet.getInt("id"));
                    columnEmail.add(resultSet.getString("tx_email"));
                    columnSituation.add(UsuarioDao.getSituacao(resultSet.getInt("cd_situacao")));
                }

                result.add(columnId);
                result.add(Format.getBooleanLinkedList(columnId.size()));
                result.add(columnEmail);
                result.add(columnSituation);
                result.add(Format.getBooleanLinkedList(columnId.size()));
            }
        }
        return result;
    }

    /**
     * Carregar as informações do objeto usuário a partir de um id
     *
     * @param id Id do usuário buscado
     */
    public void buscar(int id) {
        try {
            setId(id);
            String sql = "SELECT * FROM usuario WHERE id = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.first()) {
                senha = resultSet.getString("tx_senha");
                email = resultSet.getString("tx_email");
                situacao = EnumSituacaoUsuario.ConverterNumeroEnum(resultSet.getInt("cd_situacao"));
                nome = resultSet.getString("tx_nome");
                tipoUsuario = EnumTipoUsuario.ConverterNumeroEnum(resultSet.getInt("cd_tipo"));
                
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Usuário");
        }
    }

    /**
     * Insere um usuário no banco
     */
    public void inserir() throws SQLException {
        String sql = "INSERT INTO"
                + " usuario "
                + "(tx_email,"
                + " tx_senha,"
                + " cd_situacao,"
                + " cd_tipo,"
                + " tx_nome) "
                + "VALUES("
                + " ?,"
                + " ?,"
                + " ?,"
                + " ?,"
                + " ?)";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setString(1, email);
        preparedStatement.setString(2, senha);
        preparedStatement.setInt(3, EnumSituacaoUsuario.ConverterEnumNumero(situacao));
        preparedStatement.setInt(4, EnumTipoUsuario.ConverterEnumNumero(tipoUsuario));
        preparedStatement.setString(5, nome);
        preparedStatement.executeUpdate();

        //Recebendo o novo id gerado
        ResultSet resultSet = preparedStatement.getGeneratedKeys();
        while (resultSet.next()) {
            id = resultSet.getInt(1);
        }

        preparedStatement.close();
        resultSet.close();
    }

    /**
     * Atualiza o usuário no banco
     */
    public void atualizar() throws SQLException {
        String sql = "UPDATE usuario SET tx_email= ? ,tx_senha= ? ,"
                + "cd_situacao= ? , tx_nome = ?, cd_tipo = ? WHERE id = ?";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setString(1, email);
        preparedStatement.setString(2, senha);
        preparedStatement.setInt(3, EnumSituacaoUsuario.ConverterEnumNumero(situacao));
        preparedStatement.setString(4, nome);
        preparedStatement.setInt(5, EnumTipoUsuario.ConverterEnumNumero(tipoUsuario));
        preparedStatement.setInt(6, id);
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }

    public void deletar() throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }


    public static int getSituacao(String currentSituation) {
        if (currentSituation.equalsIgnoreCase("ATIVADO")) {
            return 1;
        } else {
            return 0;
        }
    }

    public static String getSituacao(int currentSituation) {
        switch (currentSituation) {
            case 1:
                return "ATIVADO";
            default:
                return "DESATIVADO";
        }
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public SituacaoUsuario getSituacao() {
        return situacao;
    }

    public void setSituacao(SituacaoUsuario situacao) {
        this.situacao = situacao;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
}
